#include <stdint.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

#define BUT_PIN 0x10
#define LED_PIN 0x01
#define TST_MES 0xA5
#define ONE_SEC 31250
#define FIVE_MS 156
#define MSG_LEN 12

#define TRUE 1
#define FALSE 0

// 380 - использовать для задержки в 380 мс
// 800 - используется для наглядности, т.к. задержка в 380 мс слишком маленькая
#define MAGIC_VALUE 800

int state = 1;
int state_led = 0;
int count_button_push = 0;

// проверка состояния кнопки
inline int but_test (void) { 	
	return (PINB & BUT_PIN) > 0 ? FALSE : TRUE;
}

// смена состояния светодиода
void reverse_led (void) {
	if (state_led == 0) {
		state_led = 1;
		PORTB &= 0xfe;
	} else {
		state_led = 0;
		PORTB |= 0x01;
	}
}

// обработчик прерывания таймера1
ISR (TIMER1_COMPA_vect) {
    if(but_test() == TRUE) {
		count_button_push += 5;
		
		// если кнопка нажата и мы превысили интервал
		if((count_button_push >= MAGIC_VALUE) && (state == 0)) {
				state = 1;
				reverse_led();
			}
	}
	else {
		// сброс состояния программы при отжатии кнопки
		if(state == 1) {
			state = 0;
			reverse_led();
			count_button_push = 0;
		}
	}
}

int main () {
    //pin 0 - led act GND, pin 4 - button act GND
    DDRB = 0x01;
    PORTB = 0x10;
	
	SREG = 0x80;
	
    //CTC, presc 256
    TCCR1B = _BV(WGM12) | _BV(CS12);
    TIMSK  = _BV(OCIE1A);
    OCR1A  = FIVE_MS;
	
    while (1) {
    } 

    return 0;
}